Вложенные классы
- Статические вложенные классы
- Внутренние классы
- Локальные классы
- Анонимные классы
Статические вложенные классы
- Доступ только к статическим полям внешнего класса
- Не требует экземпляра внешнего класса
- Логическая группировка классов
class Outer {
static class Static { }
}
var object = new Outer.Static();
Внутренние классы
- Доступ ко всем полям внешнего класса
- Связаны с экземпляром внешнего класса
class Outer {
private int field;
class Inner {
public int getOuterField() {
return field;
}
}
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
print(inner.getOuterField());
Классы, вложенные в интерфейс
- По умолчанию
public static
public interface Vehicle {
void start();
class Engine {
private int horsepower;
public Engine(int horsepower) {
this.horsepower = horsepower;
}
public void roar() {
System.out.println("Roar");
}
}
}
Vehicle.Engine myEngine = new Vehicle.Engine(150);
myEngine.roar();
Локальные классы
- Объявляются внутри метода
- Видимость только внутри метода
- Нет модификаторов
class Outer {
void outerMethod() {
class Local {
void innerMethod() { }
}
Local local = new Local();
local.innerMethod();
}
}
Анонимные классы
- Объявление и создание в одном выражении
- Отсутствие имени класса
- Реализация интерфейсов или наследование классов
interface I { void method(); }
I obj = new I() {
@Override
public void method() {
print("Hello");
}
};
obj.method();
Дополнительно: про вложенные интерфейсы